(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    //AMD
    define(factory)
  } else if (typeof exports === 'object') {
    //Node, CommonJS之类的
    module.exports = factory()
  } else {
    //浏览器全局变量(root 即 window)
    root.ResLoader = factory(root)
  }
}(this, function () {
  const isFunc = function (f) {
    return typeof f === 'function'
  }

  class ResLoader {
    constructor(config) {
      this.option = {
        resourceType: 'image', //资源类型，默认为图片
        baseUrl: './', //基准url
        resources: [], //资源路径数组
        onStart: null, //加载开始回调函数，传入参数total
        onProgress: null, //正在加载回调函数，传入参数currentIndex, total
        onComplete: null //加载完毕回调函数，传入参数total
      }

      this.option = Object.assign({}, this.option, config)

      this.status = 0 //加载器的状态，0：未启动   1：正在加载   2：加载完毕
      this.total = this.option.resources.length || 0 //资源总数
      this.currentIndex = 0 //当前正在加载的资源索引
    }

    start() {
      this.status = 1
      const _this = this
      let url = ''

      this.option.resources.forEach((item, index) => {
        if ((item.startsWith('http://') || item.startsWith('https://'))) {
          url = item
        } else {
          url = this.option.baseUrl + item
        }

        const image = new Image()
        image.src = url
        image.onload = function () {
          _this.loaded()
        }
        image.onerror = function () {
          _this.loaded()
        }
      })

      if (isFunc(this.option.onStart)) this.option.onStart(this.total)
    }

    loaded() {
      if (isFunc(this.option.onProgress)) {
        this.option.onProgress(++this.currentIndex, this.total);
      }
      //加载完毕
      if (this.currentIndex === this.total) {
        if (isFunc(this.option.onComplete)) {
          this.option.onComplete(this.total)
        }
      }
    }
  }

  return ResLoader
}))
